﻿#pragma once
#include "sqlite3.h"
#include <regex>
#include "TOOLBOX4.h"
//#include "NextCheckSec.h"
//#include "MySuspiciousFile.h"
#include <TypeStruct.h>
#include <GetLogCollection.h>

// 4688日志, 进程创建
typedef struct _ProcessCreation_
{
	TCHAR event_level[16];				// 事件级别		"信息"
	TCHAR date[64];						// 日期+时间	"2018/07/05 14:28:46"
	TCHAR source[64];					// 来源			"Microsoft-Windows-Security-Auditing"
	TCHAR event_id[16];					// 事件ID		"4688"
	TCHAR task_type[64];				// 任务类别		"进程创建"
	// 创建者主题
	TCHAR Cr_security_ID[64];			// 安全ID		"USERCHI-1JL7L9M\Administrator"
	TCHAR Cr_account_name[64];			// 账户名		"Administrator"
	TCHAR Cr_account_region[64];		// 账户域		"USERCHI-1JL7L9M"
	TCHAR Cr_LoginID[64];				// 登录ID		"0x1483E106"
	// 目标主题
	TCHAR Tg_security_ID[64];			// 安全ID		"NULL SID"
	TCHAR Tg_account_name[64];			// 账户名		"-"
	TCHAR Tg_account_region[64];		// 账户域		"-"
	TCHAR Tg_loginID[64];				// 登录ID		"0x0"
	// 进程信息
	TCHAR New_processID[16];			// 新进程ID		"0x2900"
	TCHAR New_processName[256];			// 新进程名称	"\Device\HarddiskVolume10\ThreatDetectionSystem\Updater.exe"
	TCHAR token_type[16];				// 令牌提升类型	"%%1936"
	TCHAR Mandatory_Label[64];			// 强制性标签	"Mandatory Label\High Mandatory Level"
	TCHAR creator_processID[16];		// 创建者进程ID		"0x1b8c"
	TCHAR creator_processName[256];		// 创建者进程名称	"C:\Windows\explorer.exe"
}_CreateProcess, *p_CreateProcess;	// 4688 进程创建 日志完整信息

// 4689日志, 进程退出
typedef struct _ProcessExit_
{
	TCHAR event_level[16];				// 事件级别		"信息"
	TCHAR date[64];						// 日期+时间	"2018/7/5 14:28:46"
	TCHAR source[64];					// 来源			"Microsoft-Windows-Security-Auditing"
	TCHAR event_id[16];					// 事件ID		"4688"
	TCHAR task_type[64];				// 任务类别		"进程终止"
	//使用者
	TCHAR Security_ID[64];				// 安全ID		"USERCHI-1JL7L9M\Administrator"
	TCHAR Account_name[64];				// 账户名		"Administrator"
	TCHAR Account_region[64];			// 账户域		"USERCHI-1JL7L9M"
	TCHAR LoginID[64];					// 登录ID		"0x1483E106"
	//进程信息
	TCHAR ProcessID[16];				// 进程ID	
	TCHAR ProcessName[256];				// 进程名称
	TCHAR ExitStatus[16];				// 退出状态		0x0
}_ExitProcess, *p_ExitProcess;	// 4689 进程退出 日志完整信息

// 进程信息
typedef struct _ProcessInfo_
{
	TCHAR ProcessName[256];		// 进程名称
	TCHAR ProcessID[16];		// 进程ID
	TCHAR ParentPrcID[16];		// 父进程ID
	TCHAR ParentPrcName[256];	// 父进程名称
	TCHAR CreateTime[64];		// 创建时间
	TCHAR ExitTime[64];			// 退出时间
	TCHAR ExitStatus[16];		// 退出状态
}_ProcessInfo, *p_ProcessInfo;	// 进程信息

// 4624日志, 登录
typedef struct _UserLogin_
{
	TCHAR event_level[16];				// 事件级别	
	TCHAR date[64];						// 日期+时间
	TCHAR source[64];					// 来源		
	TCHAR event_id[16];					// 事件ID	
	TCHAR task_type[64];				// 任务类别	
// 使用者
	TCHAR uSecurity_ID[64];				// 安全ID
	TCHAR uAccount_name[64];			// 账户名
	TCHAR uAccount_region[64];			// 账户域
	TCHAR uLoginID[64];					// 登录ID
// 登录信息
	TCHAR LoginType[8];					// 登录类型
	TCHAR RestrictedAdmin[16];			// 受限制的管理员模式
	TCHAR VirtualAccount[8];			// 虚拟账户
	TCHAR ElevateToken[8];				// 提升的令牌

	TCHAR SimulationLevel[8];			// 模拟级别	

// 新登录
	TCHAR nSecurity_ID[64];				// 安全ID
	TCHAR nAccount_name[64];			// 账户名
	TCHAR nAccount_region[64];			// 账户域
	TCHAR nLoginID[64];					// 登录ID
	TCHAR LinkLoginID[64];				// 链接的登录ID
	TCHAR NetAccount_name[64];			// 网络账户名称
	TCHAR NetAccount_region[64];		// 网络账户域
	TCHAR nLogin_GUID[64];				// 登录GUID
// 进程信息
	TCHAR ProcessID[16];				// 进程ID
	TCHAR ProcessName[256];				// 进程名称
// 网络信息
	TCHAR Workstation_name[64];			// 工作站名称
	TCHAR SrcNetAddr[64];				// 源网络地址
	TCHAR SrcPort[8];					// 源端口
// 详细的身份验证信息
	TCHAR LoginProcess[256];			// 登录进程
	TCHAR AuthPackage[64];				// 身份验证数据包 authentication
	TCHAR TransmitSev[64];				// 传递的服务
	TCHAR PackageName[64];				// 数据包名(仅限 NTLM)
	TCHAR SecretKeyLen[16];				// 秘钥长度
}_UserLogin_4624, *p_UserLogin_4624; // 4624登录

// 4648日志 登录
typedef struct _UserLogin__
{
	TCHAR event_level[16];				// 事件级别	
	TCHAR date[64];						// 日期+时间
	TCHAR source[64];					// 来源		
	TCHAR event_id[16];					// 事件ID	
	TCHAR task_type[64];				// 任务类别	
// 使用者
	TCHAR uSecurity_ID[64];				// 安全ID
	TCHAR uAccount_name[64];			// 账户名
	TCHAR uAccount_region[64];			// 账户域
	TCHAR uLoginID[64];					// 登录ID
	TCHAR uLoginGUID[64];				// 登录GUID
// 使用了哪个账户的凭据
	TCHAR Account_name[64];				// 账户名
	TCHAR Account_region[64];			// 账户域
	TCHAR LoginGUID[64];				// 登录GUID
// 目标服务器
	TCHAR DestServerName[64];			// 目标服务器名
	TCHAR SubjoinInfo[64];				// 附加信息
// 进程信息
	TCHAR ProcessID[16];				// 进程ID
	TCHAR ProcessName[256];				// 进程名称
// 网络信息
	TCHAR NetAddr[64];					// 网络地址
	TCHAR Port[8];						// 端口

}_UserLogin_4648, *p_UserLogin_4648;	// 4648登录

typedef struct _FiltratedIP_
{
	CString Date;	
	CString IP;		
	CString Port;
}_FiltratedIP, *p_FiltratedIP;

// IP活动时间范围结构 db
typedef struct _Ip_TimeRange_
{
	TCHAR IP[50];				// IP
	TCHAR FirstTime[32];		// 第一次出现时间
	TCHAR LastTime[32];			// 最后一次出现时间
	TCHAR IpSource;				// IP来源 0表示web日志，1表示内核，2表示主机日志，3表示数据库日志
}_Ip_TimeRange, *p_Ip_TimeRange;

typedef struct _Ip_Tools_
{
	CString Ip;
	CString Tools;
}_Ip_Tools, *p_Ip_Tools;

typedef struct
{
	CString host_ip;//本机IP
	CString attack_ip;//攻击IP
	CString attack_name;//攻击事件名
	CString attack_time_begin;//攻击开始时间
	CString attack_time_end;//攻击结束时间
	CString task_name;//任务名称
	CString file_md5;//文件md5
	CString tool_name;//工具名称
	CString login_name;//账户名
	CString suspicious_username;//可疑账户名
	CString operant_hehavior;//操作行为
	CString process_id;//进程ID
	CString process_name;//进程名
	CString file_name;//文件名
	CString port;//端口
	CString port_connected_status;//端口状态

}EVENT_ASSOCIATION_ANALYSIS,*PEVENT_ASSOCIATION_ANALYSIS;//攻击事件
typedef struct 
{
	CString attack_ip;//攻击IP
	CString host_ip;//本机IP
	CString attack_event_name;//攻击事件（编号）
	CString attack_begin_time;//攻击开始时间
	CString attack_end_time;//攻击结束时间

}ATTACKIPANALYSIS ,*PATTACKIPANALYSIS;//攻击IP分析
/*
#ifndef __IpTimeRange_
#define __IpTimeRange_
typedef struct _IpTimeRange_
{
	TCHAR IP[50];
	TCHAR FirstTime[32];
	TCHAR LastTime[32];
	TCHAR IpSource;
	vector<CString> vTime;
}IpTimeRange_, *p_IpTimeRange_;
#endif
*/


BOOL YDGetFilesInDirectory(const CString &sPath, std::vector<CString> &vec1, CString reg);


typedef std::vector<p_CreateProcess>::iterator  v4688it;
typedef std::vector<p_ExitProcess>::iterator  v4689it;
class CLogAnalyze
{
public:
	CLogAnalyze(void);
	~CLogAnalyze(void);


public: // 方法
	void GetIPAddr();

	// 从所有安全日志中筛选出 4688日志
	void Get_4688_Log();
	// 从所有4688日志中筛选出 创建CMD进程的日志
	void Get_CreateCMD_Log();
	//从所有安全日志中筛选出 4689日志
	void Get_4689_log();
	// 创建CDM进程的日志分析
	void CtCmdLogAnaly();

	// 从安全日志中筛选出 0-4 点的日志
	void Get0_4Log();
	// 分析0-4点的日志
	void Log0_4Analy();

	// 5156日志
	void Get_IsIP_Log();

	void GetIPofDate(CString BegDate, CString EndDate);

	void GetDateOfIP(CString IP);

	// 文件深度
	void FileNeep(int type, std::vector<p_IpTimeRange_>&vt);

	// 清空 联网痕迹-深度采集结果
//	static void ClearNetDeepRst();

	// 清空 介质痕迹-深度采集解果
//	static void ClearUsbDeepRst();

public: // 属性

	//// 存放系统日志 用于日志分析
	//static vector<PSYSTEMLOGINFO> m_vSystemLog;
	//// 存放应用程序日志 用于日志分析
	//static vector<PAPPLICATIONLOGINFO> m_vAppLog;
	// 存放安全日志 用于日志分析
	static std::vector<PSYSTEMLOGINFO> m_vSecurityLog;

	// 存放从日志中拿出所有IP地址
	static std::vector<CString> m_vIP;

	// 存放筛选后的日志信息 创建进程4688 的日志
	static std::vector<p_CreateProcess> m_v4688Log;
	// 存放筛选后的日志 创建 cmd 进程的日志
	static std::vector<p_CreateProcess> m_vCMDlog;
	
	// 存放筛选后的日志, 进程退出日志, 4689
	static std::vector<p_ExitProcess> m_v4689Log;

	// 0点-4点 的日志
	static std::vector<PSYSTEMLOGINFO> m_vSecurity0_4;
	// 登录日志
	static std::vector<PSYSTEMLOGINFO> m_vLogin_4624;
	static std::vector<PSYSTEMLOGINFO> m_vLogin_4648;
	// 筛选后的登录日志
	static std::vector<p_UserLogin_4624> m_vfLogin_4624;
	static std::vector<p_UserLogin_4648> m_vfLogin_4648;
	// 创建进程的日志
	static std::vector<p_CreateProcess> m_vCrtPrcs0_4;

	// 5156, 5157, 5158, 5159, 5152, 5153 日志
	static std::vector<std::vector<std::pair<CString, CString>>> m_vLog_5156;
	static std::vector<std::vector<std::pair<CString, CString>>> m_vLog_5157;
	static std::vector<std::vector<std::pair<CString, CString>>> m_vLog_5158;
	static std::vector<std::vector<std::pair<CString, CString>>> m_vLog_5152;
	static std::vector<std::vector<std::pair<CString, CString>>> m_vLog_5153;
	static std::vector<p_FiltratedIP> m_vfIP;


// 从数据库分析
public:
	// 从Web引擎结果数据库获取攻击IP
	void GetAttackIp(std::vector<CString>&vt);

	// 通过IP,获取时间范围
	p_Ip_TimeRange GetTimeRange_IP(char *IP);

	void GetTimeRange_IP(std::vector<CString>&vtIp, std::vector<p_IpTimeRange_>&vResult);

	void SynthesisAnalyze(HWND hWnd, int nTaskID, int type, sqlite3*db);
	//根据Web_Attack_Action表中数据获取攻击事件信息，并写入event_association_analysis表中
	void GetAttackInfo();
	// 从中间件的所有日志里确定ip的时间范围
	void GetTimeFromLog(std::vector<p_IpTimeRange_>&vt);
	void InsertAttackIpData(ATTACKIPANALYSIS &attackIPstruct,sqlite3 *db);
	void Insertevent_association_analysis(EVENT_ASSOCIATION_ANALYSIS &eventstruct,sqlite3 *db);

	void SusAccount(sqlite3 *db);
	void HideProcessToDb(sqlite3*db);
	void HidePortToDb(sqlite3*db);
	void WebFileInfo(sqlite3 *db);
	void HostLogFileInfo(sqlite3 *db);
	//分析筛选平台
	void Screening_Platform_Links(sqlite3 *db);
	//分析数据库可疑日志
	void GetSuspicious_Log(sqlite3 *db,CString strPrcId,CString strIP,CString strLogonTime,CString strDbType);
	//获取非本地IP成功登录数据的远程IP
	void GetSuspiciousIP(sqlite3 *db,CString strDbType);
	//数据库日志用户爆破
	void GetDbLogUser_violence_crack(sqlite3 *db, std::vector<CString>&vtPrcid,CString strDbType);
	//插入数据库日志登录表
	void InsertDbLog_LogonLog(sqlite3 *db,CString dbType);
	//根据Pc_Account获取采集端数据库类型
	void GetdbTyepByPc_Account(sqlite3 *db, std::vector<CString> &strDBType);
	//void GetHidePortAttackIP(vector<ATTACKIPANALYSIS>& attackIPs,sqlite3 *db);
	void GetAttackEventByDB(sqlite3 *db,CString dbType);
	//2021.11.24mongodb登录日志信息表
	void mongoDBLogonLog(sqlite3 *db);
	//2021.11.25把mongodb登录日志过滤插入数据库日志登录表中
	void InsertDatabaseLogonLogbymongoDB(sqlite3 *db);
public:
	sqlite3 * m_hSql;


};

